package com.wn.portal.controller;

import com.wn.portal.api.FeignClientApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author yellow Docter
 * @date 2023 -07-18
 * @desc 测试 openfeign 远程调用
 */
@Slf4j
@RestController
@RequestMapping("/feign")
public class FeignController {

    //使用远程调用结果
    @Autowired
    private FeignClientApi feignClientApi;

    /**
     *
     *  openfeign 的底层原理:
     *  1、FeignClientApi 如何 添加到ioc容器中?
     *         1、@EnableFeignClients 这个  @Import(FeignClientsRegistrar.class)   (通过注解把FeignClientsRegistrar 添加到ioc容器中 )
     *         2、FeignClientsRegistrar 类做什么?
     *                  类中会扫描FeignClient的注解,把对象添加到ioc容器中
     *                   Map<String, Object> attributes = annotationMetadata
     * 					.getAnnotationAttributes(FeignClient.class.getCanonicalName());
     *
     *  2、feignClientApi.findMemberById(id); 做了什么事情?
     *       1、把接口进行动态代理:
             * 	ReflectiveFeign这个对象
             *    会执行invoke 方法
             * 2、invoke执行的时候 会调用SynchronousMethodHandler中的
             * 	invoke方法：
             *     1、创建  RequestTemplate template = this.buildTemplateFromArgs.create(argv);
             * 	   2、 进行配置 Options options = this.findOptions(argv);
             *
             * 3、执行this.executeAndDecode(template, options);
             *    进行了编码和解码
             *   1、创建请求对象 Request request = this.targetRequest(template);
             *   2、执行发送请求  response = this.client.execute(request, options);
             *   3、把返回结果进行解码
             *       response = response.toBuilder().request(request).requestTemplate(template).build();
             *  4、把执行结果进行返回
     *
     *
     */

    @GetMapping("/{id}")
    public String findMemberById(@PathVariable("id") Integer id) {
        String result = feignClientApi.findMemberById(id);
        log.info("使用feign 进行调用:{}", id);
        return "portal 会员:" + result;
    }

}
